#pragma once

#include <iostream>
#include <string>
#include <ctemplate/template.h>
#include "./oj_model_database.hpp" // 使用数据库版的题库
// #include "./oj_model_file.hpp" // 使用文件版的题库

namespace ns_view
{
    using namespace ns_model;

    // 待渲染网页所在的路径
    const std::string template_path = "./template_html/";

    class View
    {
    public:
        View() {}
        ~View() {}

        void AllExpandHtml(const vector<struct Question> &questions, std::string *html)
        {
            // 题目编号 题目标题 题目难度
            // 1. 构建路径
            std::string src_html = template_path + "all_questions.html";
            
            // 2. 形成数据字典
            ctemplate::TemplateDictionary dict("all_questions"); // 类似于 unordered_map<...> all_questions
            for(const auto& q : questions)
            {
                // 形成子字典, 相当于嵌套
                ctemplate::TemplateDictionary* subDict = dict.AddSectionDictionary("question_list");
                subDict->SetValue("number", q.number); // 类似于 question_list["number"] = q.number
                subDict->SetValue("title", q.title);
                subDict->SetValue("star", q.star);
            }
            
            // 3. 获取待渲染的 html 网页
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            // 4. 将字典数据添加到待渲染的网页中
            tpl->Expand(html, &dict);
        }

        void OneExpandHtml(const struct Question &q, std::string *html)
        {
            // 1. 构建路径
            std::string src_html = template_path + "one_question.html";

            // 2. 形成数据字典
            ctemplate::TemplateDictionary dict("one_question");
            dict.SetValue("number", q.number);
            dict.SetValue("title", q.title);
            dict.SetValue("star", q.star);
            dict.SetValue("desc", q.desc);
            dict.SetValue("header", q.header);

            // 3.获取待渲染的 html 网页
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            // 4. 将字典数据添加到待渲染的网页中
            tpl->Expand(html, &dict);
        }
    };
}